package bcpay

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"sort"
	"strings"

	"github.com/bytedance/sonic"
)

// 生成签名
func GenerateSign(p map[string]any, secret string) string {
	originStr := sortParameters(p)
	originStr += "&key=" + secret
	return SHA256(originStr)
}

// 参数升序排序并使用 QueryString 格式
func sortParameters(params map[string]any) string {
	// 返回升序排序切片
	s := sortMap(params)
	// 拼接成字符串
	var sortedParams []string
	for _, key := range s {
		// 过滤签名字段
		if key == "sign" {
			continue
		}
		// 过滤空字符串
		if t, ok := params[key].(string); ok && t == "" {
			continue
		}
		if key == "extra" {
			params[key] = sortParameters(params[key].(map[string]any))
		}
		if key == "params" {
			str, _ := sonic.Marshal(params[key])
			params[key] = string(str)
		}
		sortedParams = append(sortedParams, fmt.Sprintf("%s=%s", key, params[key]))
	}
	return strings.Join(sortedParams, "&")
}

// 对 map 的 key 排序
func sortMap(p map[string]any) (keys []string) {
	for key := range p {
		keys = append(keys, key)
	}
	sort.Strings(keys)
	return
}

// SHA256 加密和验签
func SHA256(originStr string) string {
	// 使用 SHA256 进行哈希
	hash := sha256.Sum256([]byte(originStr))
	// 将哈希值转换为16进制字符串
	return hex.EncodeToString(hash[:])
}
